package org.moonlight.jvm.classpath;

import org.moonlight.jvm.classpath.entry.CompositeEntry;
import org.moonlight.jvm.classpath.entry.DirEntry;
import org.moonlight.jvm.classpath.entry.ZipEntry;
import org.moonlight.jvm.common.Constant;

import java.io.File;
import java.io.IOException;

/**
 *
 * JVM可读取的类路径项，分四种类型:
 *   1. 目录形式 {@link DirEntry}
 *   2. 压缩包形式（jar 和 zip） {@link ZipEntry}
 *   3. 通配符形式
 *   4. 混合形式（以上三种的混合体，以路径分隔符分割）。
 *
 * 该接口就是用于表示 类路径项
 *
 * @author Moonlight
 * @createTime 2023/8/14 14:37
 **/
@FunctionalInterface
public interface Entry {

    /**
     * 根据 类的完全限定名 去 类路径 中找到并读取该类文件的内容
     * @param className 类名 - 类的完全限定名. 如: 需要读取 java.lang.Object 应该传入 java/lang/Object.class
     * @return 类文件字节数据
     * @createTime 14:46 2023/8/14
     * @throws IOException 文件读取过程中可能发生IO异常
     * @author moonlight
     **/
    byte[] readClass(String className) throws IOException;

    /** 
     * 根据
     * @param path 类路径
     * @return Entry
     * @createTime 14:56 2023/8/14
     * @author moonlight
     **/
    static Entry create(String path) {
        if (path.contains(File.pathSeparator)) {
            return new CompositeEntry(path);
        }
        if (path.endsWith(Constant.LOW_JAR_SUFFIX) || path.endsWith(Constant.UP_JAR_SUFFIX)
            || path.endsWith(Constant.LOW_ZIP_SUFFIX) || path.endsWith(Constant.UP_ZIP_SUFFIX)) {
            return new ZipEntry(path);
        }
        return new DirEntry(path);
    }

}
